package com.tianfei.crowd.mvc.controller;

import com.tianfei.crowd.entity.Menu;
import com.tianfei.crowd.service.api.MenuService;
import com.tianfei.crowd.utils.ResultEntity;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @author: Herz
 * @date: 2021/7/16 12:12
 */
@RestController
public class MenuController {

    @Autowired
    private MenuService menuService;

//    @ResponseBody
    @RequestMapping("/menu-remove.json")
    public ResultEntity<String> remove(@RequestParam("id") Integer id){

        menuService.deleteMenuById(id);

        return  ResultEntity.successWithOutData();
    }


//    @ResponseBody
    @RequestMapping("/menu-update.json")
    public ResultEntity<String> updateMenu(Menu menu){

        menuService.updateMenu(menu);

        return ResultEntity.successWithOutData();
    }



//    @ResponseBody
    @RequestMapping("/menu-save.json")
    public ResultEntity<String> saveMenu(Menu menu){

        menuService.saveMenu(menu);

        return ResultEntity.successWithOutData();
    }



//    @ResponseBody
    @RequestMapping("/menu-get-tree.json")
    public ResultEntity<Menu> getWholeTree(){

        // 1、获取全部的 Menu 对象
        List<Menu> menuList = menuService.getAll();

        // 2、声明一个变量来存储根节点
        Menu root = null;

        // 3、创建 Map 对象来存储 id 和 Menu 对象的对应关系，以便于查找父节点
        Map<Integer,Menu> menuMap = new HashMap<>();

        // 4、遍历 menuList 填充 menuMap
        for (Menu menu : menuList) {

            Integer id = menu.getId();

            menuMap.put(id,menu);
        }

        // 5、再一次遍历 menuList 找到根节点，组装父子节点
        for (Menu menu : menuList) {

            // 6、获取当前 menu 对象的 pid
            Integer pid = menu.getPid();

            // 7、如果 pid 为 null 则为根节点
            if (pid == null){
                root = menu;

                // 8、如果是根节点，该次循环就不必继续执行后面代码
                continue;
            }

            // 9、如果pid不是null，则当前节点有父节点，根据pid到menuMap中查找就可找到父节点
            Menu father = menuMap.get(pid);

            // 10、将当前节点存入到父节点的children集合中
            father.getChildren().add(menu);
        }

        // 11、经过上面的运算，根节点已经包含了整个树形结构，返回根节点，就是返回整个树
        return ResultEntity.successWithData(root);
    }
}
